package baja;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

public class Equipe implements Comparable<Equipe>{

	Integer numero;
	String nome;
	Calendar checkpoint;
	List<Calendar> voltas;
	
	/**
	 * Construtor
	 * @param numero Numero de identificacao da equipe, responsavel por adicionar as voltas
	 * @param nome Nome da equipe
	 * @param checkpoint Horario da abertura da volta
	 */
	public Equipe(int numero, String nome) {
		this.numero = numero;
		this.nome = nome;
		this.voltas = new ArrayList<Calendar>();
	}
	/**
	 * Metodo responsavel por iniciar a primeira volta da equipe
	 */
	public void start(){
		this.checkpoint = new GregorianCalendar();
	}
	/**
	 * Obtem o numero de voltas da equipe
	 * @return voltas.size()
	 */
	public Integer getNumVoltas() {
		return this.voltas.size();
	}
	/**
	 * Metodo utilizado para obter o tempo da ultima volta da equipe.
	 * 0:0:0 caso ainda nao tenha completado nenhuma.
	 * @return Tempo da ultima volta da equipe.
	 */
	public Calendar getUltimaVolta() {
		if (voltas.size() > 0) {
			return voltas.get(voltas.size()-1);
		} else {
			Calendar aux = new GregorianCalendar();
			aux.set(Calendar.HOUR_OF_DAY, 0);
			aux.set(Calendar.MINUTE, 0);
			aux.set(Calendar.SECOND, 0);
			return aux;
		}
	}
	/**
	 * Obtem o numero da equipe
	 * @return Numero da equipe
	 */
	public Integer getNum() {
		return this.numero;
	}
	/**
	 * Obtem o nome da equipe
	 * @return Nome da equipe
	 */
	public String getNome() {
		return this.nome;
	}
	/**
	 * Obtem o checkpoint para calcular quem abriu a volta ha mais tempo
	 * @return Checkpoint
	 */
	public Calendar getCheckpoint() {
		return this.checkpoint;
	}
	/**
	 * Adiciona mais uma volta a equipe.
	 * O metodo obtem o horario atual e de acordo com o checkpoint calcula o tempo da volta.
	 * O checkpoint (usado como referencia para o inicio da volta) tambem eh atualizado.
	 */
	public void add(){
		Calendar volta = new GregorianCalendar();
		Calendar novaVolta = new GregorianCalendar();
		novaVolta.add(Calendar.HOUR_OF_DAY, -this.checkpoint.get(Calendar.HOUR_OF_DAY));
		novaVolta.add(Calendar.MINUTE, -this.checkpoint.get(Calendar.MINUTE));
		novaVolta.add(Calendar.SECOND, -this.checkpoint.get(Calendar.SECOND));
		this.checkpoint = volta;
		this.voltas.add(novaVolta);
	}
	/**
	 * Esqueve num arquivo voltas/nome da equipe.txt os tempos das voltas
	 */
	public void escreverRegistro(){
        try{
        		String endereco = "Voltas\\";
        		endereco += this.nome + ".txt";
                File out = new File(endereco);
                OutputStream fileEscrita = new  FileOutputStream(out);
                OutputStreamWriter wEscrita = new OutputStreamWriter(fileEscrita);  
                BufferedWriter bufEscrita = new BufferedWriter(wEscrita);
                                
                for (int i = 0; i < this.voltas.size(); i++) {
                	int horas = this.voltas.get(i).get(Calendar.HOUR_OF_DAY);
                	String h = String.valueOf(horas);
                	int minutos = this.voltas.get(i).get(Calendar.MINUTE);
                	String m = new String();
                	if (minutos < 10) {
						m += "0";
					}
                	m += String.valueOf(minutos);
                	int segundos = this.voltas.get(i).get(Calendar.SECOND);
                	String s = new String();
                	if (segundos < 10) {
						s += "0";
					}
                	s += String.valueOf(segundos);
                	bufEscrita.write(i+1 + "\t" + h + ":" + m + ":" + s + "\r\n");
				}
                
                bufEscrita.close();
                wEscrita.close();
                fileEscrita.close();
                
        }
        catch(IOException e){
                System.out.println(e);
        }
	}
	@Override
	public String toString() {
		int extra = 40 - this.nome.length();
		String nome = this.nome;
		for (int i = 0; i < extra; i++) {
			nome += " ";
		}
		if (this.voltas.size() > 0) {
			String ultimaVolta = new String();
			ultimaVolta += voltas.get(voltas.size()-1).get(Calendar.HOUR_OF_DAY);
			ultimaVolta += ":";
			if (voltas.get(voltas.size()-1).get(Calendar.MINUTE) < 10) {
				ultimaVolta += "0";
			}
			ultimaVolta += voltas.get(voltas.size()-1).get(Calendar.MINUTE);
			ultimaVolta += ":";
			if (voltas.get(voltas.size()-1).get(Calendar.SECOND) < 10) {
				ultimaVolta += "0";
			}
			ultimaVolta += voltas.get(voltas.size()-1).get(Calendar.SECOND);
			return String.format("%d\t%d\t%s\t%s", this.voltas.size(), this.numero,
					nome, ultimaVolta);
		} else {
			return String.format("%d\t%d\t%s\t%s", this.voltas.size(), this.numero,
					nome, "0:00:00", this.nome);
		}
	}
	@Override
	public boolean equals(Object obj) {
	    if ((obj instanceof Equipe) && (((Equipe)obj).getNum().equals(this.getNum()))){
	    	return true;
	    } else {
	    	return false;
	    }
	}
	@Override
	public int compareTo(Equipe equipe) {
		if (this.voltas.size() < equipe.getNumVoltas()) {
			return 1;
		}
		if (this.voltas.size() > equipe.getNumVoltas()) {
			return -1;
		}
		if (this.checkpoint.before(equipe.getCheckpoint())) {
			return -1;
		}
		if (this.checkpoint.after(equipe.getCheckpoint())){
			return 1;
		}
		return this.numero.compareTo(equipe.getNum());
	}
}
